﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Onshi.POS.AccesoDatos;
using Onshi.POS.AccesoDatos.Interfaces;
using Onshi.POS.Modelo.Entidades;

namespace Onshi.POS.Repositorios
{
    public class RepositorioPerfil : RepositorioEntidad<Perfil, Int32>
    {
        #region Constructores

        public RepositorioPerfil()
            : base()
        {
            servicioDatosPerfil = new ServicioDatosPerfil();
            repositorioPermiso = new RepositorioPermiso();
        }

        #endregion

        #region Atributos

        private IServicioDatosPerfil servicioDatosPerfil;
        private RepositorioPermiso repositorioPermiso;

        #endregion

        #region Propiedades

        private IServicioDatosPerfil ServicioDatosPerfil
        {
            get { return servicioDatosPerfil; }
        }

        private RepositorioPermiso RepositorioPermiso
        {
            get { return repositorioPermiso; }
        }

        #endregion

        #region Metodos

        private PerfilDetalle FilaADetalle(DataRow fila, Perfil perfil)
        {
            var perfilDetalle = new PerfilDetalle();
            perfilDetalle.Id = (Int32)fila["IdPerfilDetalle"];
            perfilDetalle.Permiso = RepositorioPermiso.DevolverPorId((Byte)fila["IdPermiso"]);
            perfilDetalle.TienePermiso = (Boolean)fila["TienePermiso"];
            perfilDetalle.Perfil = perfil;
            return perfilDetalle;
        }

        private List<PerfilDetalle> TablaAListaDetalles(DataTable tabla, Perfil perfil)
        {
            var lista = new List<PerfilDetalle>();
            foreach (DataRow fila in tabla.Rows)
                lista.Add(FilaADetalle(fila, perfil));
            return lista;
        }

        protected override Perfil FilaAEntidad(DataRow fila)
        {
            var perfil = new Perfil();
            perfil.Id = (Int32)fila["IdPerfil"];
            perfil.Nombre = (String)fila["Nombre"];
            perfil.Observacion = (String)fila["Observacion"];
            return perfil;
        }

        public List<Perfil> DevolverTodos()
        {
            using (var ds = ServicioDatosPerfil.Perfiles_DevolverTodos())
            {
                entidades = TablaALista(ds.Tables[0]);
                foreach (var perfil in entidades)
                {
                    var detalles = ds.Tables[1].AsEnumerable().Where(x => (Int32)x["IdPerfil"] == perfil.Id).CopyToDataTable();
                    perfil.Detalles = TablaAListaDetalles(detalles, perfil);
                }
            }
            return entidades;
        }

        public override Perfil DevolverPorId(Int32 id)
        {
            var entidad = entidades.Where(x => x.Id == id).FirstOrDefault();
            if (entidad == null)
                using (var ds = ServicioDatosPerfil.Perfiles_DevolverPorId(id))
                    if (ds.Tables[0].Rows.Count != 0)
                    {
                        entidad = FilaAEntidad(ds.Tables[0].Rows[0]);
                        entidad.Detalles = TablaAListaDetalles(ds.Tables[1], entidad);
                        entidades.Add(entidad);
                    }
            return entidad;
        }

        public void Insertar(Perfil entidad)
        {
            entidad.Id = ServicioDatosPerfil.Perfiles_Insertar(entidad.Nombre, entidad.Observacion);
        }

        public void Modificar(Perfil entidad)
        {
            ServicioDatosPerfil.Perfiles_Modificar(entidad.Id, entidad.Nombre, entidad.Observacion);
        }

        public void Eliminar(Perfil entidad)
        {
            ServicioDatosPerfil.Perfiles_Eliminar(entidad.Id);
            entidad = null;
        }

        public void EliminarPerfilesDetallesPorPerfil(Perfil perfil)
        {
            ServicioDatosPerfil.PerfilesDetalles_EliminarPorPerfil(perfil.Id);
        }

        public void InsertarPerfilDetalle(PerfilDetalle perfilDetalle)
        {
            perfilDetalle.Id = ServicioDatosPerfil.PerfilesDetalles_Insertar(perfilDetalle.Perfil.Id, perfilDetalle.Permiso.Id);
        }

        #endregion
    }
}
